/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modelo.dao;

/**
 *
 * @author Rodrigo
 */

import modelo.entidades.*; 
import java.util.*; 
import org.hibernate.*;
import org.hibernate.criterion.*;
import modelo.entidades.*;
import modelo.dto.FiltroInstituicaoDTO;

public class InstituicaoDAO extends GenericDAO<Instituicao> {
    
    public List<FiltroInstituicaoDTO> findByFiltro(String nome, String segmentoNome,
            String atividadeNome, String logisticaNome, String regiaoNome, 
            String municipioNome, String bairroNome)
            throws DAOException           
    {  
        Session session = HibernateUtil.getSessionFactory().openSession();
        
        if(!session.getTransaction().isActive())
            session.beginTransaction();
        
        try
        {
        
         
            Criteria criteria =   session.createCriteria(Instituicao.class,"i")
                    .createAlias("segmento","seg")
                    .createAlias("atividade","ati")
                    .createAlias("bairro","bai")
                    .createAlias("bai.municipio","mun",Criteria.INNER_JOIN)
                    .createAlias("mun.regiao","reg",Criteria.INNER_JOIN)
                    .createAlias("logistica","l", Criteria.LEFT_JOIN);
            
            
        Junction junction =    Restrictions.conjunction()
                    .add(Restrictions.ilike("i.nome", nome))
                    .add(Restrictions.ilike("seg.nome", segmentoNome))
                    .add(Restrictions.ilike("ati.nome", atividadeNome))
                    .add(Restrictions.ilike("bai.nome", bairroNome))
                    .add(Restrictions.ilike("reg.nome", regiaoNome))
                    .add(Restrictions.ilike("mun.nome", municipioNome));
                     
                    if(logisticaNome.equals("%"))
                    {
                        junction.add(
                       Restrictions.or(Restrictions.isNull("l.nome"),Restrictions.ilike("l.nome",logisticaNome)));
                        System.out.println("entrou");
                    }
                    else
                    {
                        junction.add(Restrictions.ilike("l.nome", logisticaNome));
                    }
                    
                    
                    criteria.add(junction);
                        
        List<Instituicao> lista = criteria.list();
        
        List<FiltroInstituicaoDTO> dto = createDTO(lista);
        
        session.getTransaction().commit();
        
        return dto;
        
        
        }
        catch(Exception e)
        {
            e.printStackTrace();
            throw new DAOException();
        }
        finally
        {
            session.close();
        }
        
         
        
    }
    
    public List<Instituicao> findAll()throws DAOException
    {

        return super.findAll(Instituicao.class);      
    }
    
    public Instituicao find(Integer id)throws DAOException
    {

        return super.find(id,Instituicao.class);      
    }
    
    private List<FiltroInstituicaoDTO> createDTO(List<Instituicao> lista)
    {
        List<FiltroInstituicaoDTO> dto = new ArrayList<FiltroInstituicaoDTO>();
        
        for(Instituicao i:lista)
        {
            FiltroInstituicaoDTO filtro = new FiltroInstituicaoDTO();
            filtro.setInstituicao(i.getNome());
            filtro.setAtividade(i.getFkAtividade().getNome());
            filtro.setBairro(i.getBairro().getNome());
            if(i.getLogistica()!=null)
            filtro.setLogistica(i.getLogistica().getNome());
            filtro.setMunicipio(i.getBairro().getMunicipio().getNome());
            filtro.setRegiao(i.getBairro().getMunicipio().getRegiao().getNome());
            filtro.setSegmento(i.getSegmento().getNome());
            dto.add(filtro);
        }
        
        return dto;
    }
    
}
